package com.hp.common.annotation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 自定义校验注解
 * <p>
 * 备注:
 * ① 「注1」中的校验器(Validator)并没有指定，当然是可以像「注2」中那样直接指定校验器。
 * <p>
 * ②  考虑到自定义注解有可能是直接暴露在facade包中，而具体的校验器的实现有时候会包含一些业务依赖，所以不建议直接在此处指定，而是通过Hibernate Validator提供的Validator发现机制去完成关联
 * <p>
 * ③  Hibernate Validator提供的Validator发现机制去完成关联
 * <p>
 * a. 在resources目录下新建META-INF/services
 * /javax.validation.ConstraintValidator文件。
 * <p>
 * b. 文件中只需填入相应Validator的全路径：
 * com.xxx.demo.validator.AllowedValueValidator，如果有多个的话，每行一个。
 *
 * @author <a href="mailto:xing.dong@sha.ontime-express.com">Xavier Dong</a>
 * @date
 */
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {})// 注1
// @Constraint(validatedBy = {AllowedValueValidator.class}) 注2
public @interface AllowedValue {

    String message() default "参数值不在合法范围内";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    long[] value() default {};

}